package com.nku.mason.masonframework.core.tools;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import com.nku.mason.masonframework.util.ReflectionUtil;
/**
 * 获取被框架管理的Bean类，随后循环调用ReflectionUtil中的newInstance方法来实例化对象，最后将每次创建的对象存放在一个静态的Map<Class<?>>中。
 * @author Mason
 * @date 2017年3月13日
 */
public final class BeanTool {
	
	private BeanTool() {
		//私有构造器，防止外部实例化
	}
	
	/**
	 * 用于存放Bean类与bean实例的映射关系
	 */
	private static final Map<Class<?>, Object> BEAN_MAP = new HashMap<Class<?>, Object>();
	
	static {
		Set<Class<?>> beanClassSet = ClassTool.getBeanClassSet();
		for(Class<?> beanClass : beanClassSet){
			Object obj = ReflectionUtil.newInstance(beanClass);
			BEAN_MAP.put(beanClass, obj);
		}
	}
	
	/**
	 * 获取Bean映射
	 * @return
	 */
	public static Map<Class<?>, Object> getBeanMap(){
		return BEAN_MAP;
	}
	
	/**
	 * 获取Bean实例
	 * @param cls
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getBean(Class<T> cls){
		if (!BEAN_MAP.containsKey(cls)) {
			throw new RuntimeException("can't bean by class" + cls);
		}
		
		return (T) BEAN_MAP.get(cls);
	}
	
	/**
	 * 设置bean实例
	 * @param cls 添加至BEAN_MAP中的bean的类型
	 * @param obj 添加至BEAN_MAP中的bean实例
	 */
	public static void setBean(Class<?> cls, Object obj){
		BEAN_MAP.put(cls, obj);
	}
}
